home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 283_01 / es.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-05-04  |  14.2 KB  |  603 lines

  1.  
  2.  
  3. /* es.c -- display/edit program screens, save as compilable C source text
  4. **         d.c.oshel, 4/21/88
  5. */
  6.  
  7. #include "ciao.h"
  8. #include "keys.h"
  9. #include <dos.h>
  10. #include <signal.h>
  11.  
  12.  
  13. static int screen_number = 0;
  14. static char far *video_RAM;
  15. static char *sname;
  16.  
  17. /* control-c mesmerizer */
  18. static jmp_buf isis;
  19. void iris( void )
  20. {
  21.     longjmp(isis,-1);
  22. }
  23.  
  24.  
  25. extern unsigned read_keyboard( void (*fn) (void) );  /* Assembler! */
  26.  
  27. /*
  28. unsigned read_keyboard( void (*fn) (void) );
  29. {
  30.     union REGS rx;
  31.     while (!kbhit())
  32.         (*fn)();
  33.     rx.h.ah = 0;
  34.     int86(22,&rx,&rx); *//* damn int86 does NOT ignore Control-C! *//*
  35.     if (rx.h.al)
  36.         rx.h.ah = 0;
  37.     return (rx.x.ax);
  38. }
  39. */
  40.  
  41. int dialogue( void )
  42. {
  43.      char far *p;
  44.      union REGS x;
  45.      int c;
  46.  
  47.      p = savescreen( &x );
  48.  
  49.      defcursor();
  50.      wputs("^2");
  51.      windowbox( 21,1,59,8  );
  52.      fullscreen();
  53.      gotoxy(23,0);
  54.      wprintf("^0╡^1 %s ^0╞^2",sname);
  55.      setwindow( 21,1,59,8 );
  56.      gotoxy( 0,1 );
  57.      wputs("       ^1R^2eset screen\n");
  58.      wputs("       ^1B^2lank screen (absolute!)\n");
  59.      wputs("       ^1C^2 text file, save screen to\n");
  60.      wputs("       ^1I^2mage  file, save screen to\n");
  61.      wputs("       ^1N^2ext screen, quit editing\n\n");
  62.      wputs("       Please select: ");
  63.      flush_keys();
  64.      c = keyin( screenwait );
  65.  
  66.      restorescreen(p,&x);
  67.      return (c);
  68. }
  69.  
  70. static char namebuffer[80];
  71.  
  72. int ask( void )
  73. {
  74.      char far *p;
  75.      union REGS x;
  76.      int c;
  77.      char buffer[80];
  78.  
  79.      p = savescreen( &x );
  80.      defcursor();
  81.      wputs("^2");
  82.      windowbox( 21,12,59,14  );
  83.      sprintf(buffer,"^0  Save %s? ^1Y^0/N  \b\b\b\b\b",namebuffer);
  84.      c = ((59-21) - (strlen(buffer) - 11))/2;
  85.      if (c < 1) c = 1;
  86.      gotoxy( c,1 );
  87.      wputs(buffer);
  88.      bopbleet();
  89.      flush_keys();
  90.      do
  91.      {
  92.         c = keyin( screenwait );
  93.         c = isascii(c)? toupper(c) : c;
  94.         if (c == CR) c = 'Y';
  95.      }
  96.      while ( c != 'Y' && c != 'N' );
  97.  
  98.      restorescreen(p,&x);
  99.      return ( c == 'Y' );
  100. }
  101.  
  102.  
  103. int ask2( void )
  104. {
  105.      char far *p;
  106.      union REGS x;
  107.      int c;
  108.      char buffer[80];
  109.  
  110.      p = savescreen( &x );
  111.      defcursor();
  112.      wputs("^2");
  113.      windowbox( 21,12,59,14  );
  114.      sprintf(buffer,"^0  Save %s? ^1Y^0/N  \b\b\b\b\b",sname);
  115.      c = ((59-21) - (strlen(buffer) - 11))/2;
  116.      if (c < 1) c = 1;
  117.      gotoxy( c,1 );
  118.      wputs(buffer);
  119.      bopbleet();
  120.      flush_keys();
  121.      do
  122.      {
  123.         c = keyin( screenwait );
  124.         c = isascii(c)? toupper(c) : c;
  125.         if (c == CR) c = 'Y';
  126.      }
  127.      while ( c != 'Y' && c != 'N' );
  128.  
  129.      restorescreen(p,&x);
  130.      return ( c == 'Y' );
  131. }
  132.  
  133.  
  134. void report( void )
  135. {
  136.      char far *p;
  137.      union REGS xr;
  138.      int x,y,x1,x2,y1,y2;
  139.  
  140.      x = col;
  141.      y = row;
  142.      p = savescreen(&xr);
  143.      wputs("^3");
  144.      rptchar('\xfb',1);
  145.      hidecursor();
  146.      x1 = 1;  
  147.      y1 = 1; 
  148.      if ( ((y >= 0) && (y <= 4)) && ((x >=  0) && (x <= 22)) )
  149.      {
  150.          x1 = 58;
  151.      }
  152.      x2 = x1 + 20;
  153.      y2 = y1 + 2;
  154.      windowbox( x1,y1,x2,y2  );
  155.      gotoxy (1,1);
  156.      wprintf("^1 Column %2d, Row %2d ^0", x,y );
  157.      flush_keys();
  158.      keyin( screenwait );
  159.      restorescreen(p,&xr);
  160. }
  161.  
  162. void readscreen( void )
  163. {
  164.      FILE *fp;
  165.      register int i;
  166.      union REGS x;
  167.  
  168.      x.h.ah = 0x0F;
  169.      int86( 0x10, &x, &x );
  170.  
  171.      /* do we have mono adapter or cga/ega? */
  172.  
  173.      video_RAM = (x.h.al == 7)? ((char far *)( 0xB0000000L )) :
  174.                                 ((char far *)( 0xB8000000L ));
  175.  
  176.      if ((fp=fopen(sname,"rb")) == NULL) {
  177.           gotoxy(0,0);
  178.           rptchar(' ',2000);
  179.           windowbox( 0,0,79,24 );
  180.           fullscreen();
  181.      }
  182.      else
  183.      {
  184.           for ( i = 0; i < 4000; i++ )
  185.           {
  186.               video_RAM[i] = fgetc(fp);
  187.               if (feof(fp))
  188.               {
  189.                  video_RAM[i] = 7;
  190.               }
  191.               if (ferror(fp))
  192.               {
  193.                  gotoxy(0,24);
  194.                  printf("READSCREEN COULD NOT READ \"%s\"\n",sname);
  195.                  thurb();
  196.                  exit(1);
  197.               }
  198.           }
  199.           fclose(fp);
  200.      }
  201. }
  202.  
  203.  
  204. void title( void )
  205. {
  206.      char far *p;
  207.      union REGS x;
  208.  
  209.      p = savescreen( &x );
  210.      hidecursor();
  211.      windowbox( 21,1,59,8  );
  212.      fullscreen();
  213.      gotoxy(23,0);
  214.      wprintf("^0╡^1 %s ^0╞",strupr(sname));
  215.      setwindow( 21,1,59,8 );
  216.      gotoxy( 0,7 );
  217.      wputs("^2 Screens-to-C v.1.1, by David C. Oshel ^0\n");
  218.      wputs("       ^1MicroConsulting Services^0\n");
  219.      wputs("           ^11219 Harding Ave.^0\n");
  220.      wputs("           ^1Ames, Iowa 50010^0\n");
  221.      wputs("            ^1(515) 232-8679^0\n\n");
  222.      wputs("  Press ^1any key^0 to begin, ^1Esc^0 to quit^0");
  223.      flush_keys();
  224.      keyin( screenwait );
  225.  
  226.      restorescreen(p,&x);
  227. }
  228.  
  229.  
  230. void doit( void )
  231. {
  232.      void saveit( void );
  233.      void saveit0( void );
  234.      char far *p;
  235.      union REGS x;
  236.      unsigned int c,d;
  237.  
  238.      col = 39;
  239.      row = 12;
  240.      setcursize(0,rasterl);
  241.      wputs("^0");
  242.      p = savescreen(&x);
  243.      while (1)
  244.      {
  245.            gotoxy(col,row);
  246.            c = read_keyboard( screenwait );
  247.  
  248.            switch (c)
  249.            {
  250.            case ESC:
  251.                 d = dialogue();
  252.                 switch (d)
  253.                 {
  254.                 case 'b':
  255.                 case 'B':
  256.                      restorescreen(p,&x);
  257.                      gotoxy(0,0);
  258.                      rptchar(' ',2000);
  259.                      windowbox( 0,0,79,24 );
  260.                      fullscreen();
  261.                      col = 39;
  262.                      row = 12;
  263.                      setcursize(0,rasterl);
  264.                      wputs("^0");
  265.                      p = savescreen(&x);
  266.                      bopbleet();
  267.                      break;
  268.                 case 'r':
  269.                 case 'R':
  270.                      restorescreen(p,&x);
  271.                      p = savescreen(&x);
  272.                      bopbleet();
  273.                      break;
  274.                 case 'c':
  275.                 case 'C':
  276.                      saveit();
  277.                 case 'i':
  278.                 case 'I':
  279.                      saveit0();
  280.                 case 'n':
  281.                 case 'N':
  282.                 case 'q':
  283.                 case 'Q':
  284.                 case 'x':
  285.                 case 'X':
  286.                      _ffree(p);
  287.                      defcursor();
  288.                      goto zoo;
  289.                      break;
  290.                 default:
  291.                      break;
  292.                 }
  293.                 break;
  294.            case F1:
  295.                 wputs("^1");
  296.                 break;
  297.            case F2:
  298.                 wputs("^2");
  299.                 break;
  300.            case F3:
  301.                 wputs("^3");
  302.                 break;
  303.            case F4:
  304.                 wputs("^4");
  305.                 break;
  306.            case F5:
  307.                 wputs("^5");
  308.                 break;
  309.            case F6:
  310.                 wputs("^6");
  311.                 break;
  312.            case F7:
  313.                 wputs("^7");
  314.                 break;
  315.            case F8:
  316.                 wputs("^8");
  317.                 break;
  318.            case F9:
  319.                 wputs("^9");
  320.                 break;
  321.            case F10:
  322.                 wputs("^0");
  323.                 break;
  324.            case Alt_F1:
  325.                 rptchar('╔',1);
  326.                 ++col;
  327.                 if ( col > 79 ) col = 0;
  328.                 break;
  329.            case Alt_F2:
  330.                 rptchar('╗',1);
  331.                 ++row;
  332.                 if ( row > 24 ) row = 0;
  333.                 break;
  334.            case Alt_F3:
  335.                 rptchar('═',1);
  336.                 --col;
  337.                 if ( col < 0 ) col = 79;
  338.                 break;
  339.            case Alt_F4:
  340.                 rptchar('═',1);
  341.                 ++col;
  342.                 if ( col > 79 ) col = 0;
  343.                 break;
  344.            case Alt_F5:
  345.                 rptchar('║',1);
  346.                 --row;
  347.                 if ( row < 0 ) row = 24;
  348.                 break;
  349.            case Alt_F6:
  350.                 rptchar('║',1);
  351.                 ++row;
  352.                 if ( row > 24 ) row = 0;
  353.                 break;
  354.            case Alt_F7:
  355.                 rptchar('╟',1);
  356.                 --row;
  357.                 if ( row < 0 ) row = 24;
  358.                 break;
  359.            case Alt_F8:
  360.                 rptchar('╢',1);
  361.                 ++row;
  362.                 if ( row > 24 ) row = 0;
  363.                 break;
  364.            case Alt_F9:
  365.                 rptchar('╚',1);
  366.                 --row;
  367.                 if ( row < 0 ) row = 24; 
  368.                 break;
  369.            case Alt_F10:
  370.                 rptchar('╝',1);
  371.                 --col;
  372.                 if ( col < 0 ) col = 79;
  373.                 break;
  374.            case Shift_F1:
  375.                 rptchar('┌',1);
  376.                 ++col;
  377.                 if ( col > 79 ) col = 0;
  378.                 break;
  379.            case Shift_F2:
  380.                 rptchar('┐',1);
  381.                 ++row;
  382.                 if ( row > 24 ) row = 0;
  383.                 break;
  384.            case Shift_F3:
  385.                 rptchar('─',1);
  386.                 --col;
  387.                 if ( col < 0 ) col = 79;
  388.                 break;
  389.            case Shift_F4:
  390.                 rptchar('─',1);
  391.                 ++col;
  392.                 if ( col > 79 ) col = 0;
  393.                 break;
  394.            case Shift_F5:
  395.                 rptchar('│',1);
  396.                 --row;
  397.                 if ( row < 0 ) row = 24;
  398.                 break;
  399.            case Shift_F6:
  400.                 rptchar('│',1);
  401.                 ++row;
  402.                 if ( row > 24 ) row = 0;
  403.                 break;
  404.            case Shift_F7:
  405.                 rptchar('╞',1);
  406.                 --row;
  407.                 if ( row < 0 ) row = 24;
  408.                 break;
  409.            case Shift_F8:
  410.                 rptchar('╡',1);
  411.                 ++row;
  412.                 if ( row > 24 ) row = 0;
  413.                 break;
  414.            case Shift_F9:
  415.                 rptchar('└',1);
  416.                 --row;
  417.                 if ( row < 0 ) row = 24; 
  418.                 break;
  419.            case Shift_F10:
  420.                 rptchar('┘',1);
  421.                 --col;
  422.                 if ( col < 0 ) col = 79;
  423.                 break;
  424.            case UP:
  425.                 --row;
  426.                 if ( row < 0 ) row = 24;
  427.                 break;
  428.            case DN:
  429.                 ++row;
  430.                 if ( row > 24 ) row = 0;
  431.                 break;
  432.            case BS:
  433.            case LF:
  434.                 --col;
  435.                 if ( col < 0 ) col = 79;
  436.                 break;
  437.            case RT:
  438.                 ++col; 
  439.                 if ( col > 79 ) col = 0;
  440.                 break;
  441.            case CR:
  442.                 wputs("^0");
  443.                 col = 0;
  444.                 ++row;
  445.                 if ( row > 24 ) row = 0;
  446.                 break;
  447.            case END:
  448.            case PGUP: /* do nothing */
  449.            case PGDN:
  450.                 break;
  451.            case HOME:
  452.                 report();
  453.                 break;
  454.            default:
  455.                 rptchar(c,1);
  456.                 ++col;
  457.                 if ( col > 79 ) col = 0;
  458.                 break;
  459.            }
  460.      }
  461.      zoo:
  462.      ;
  463. }
  464.  
  465.  
  466. void editscreen( void )
  467. {
  468.      readscreen();
  469.      title();
  470.      doit();
  471. }
  472.  
  473.  
  474. void writescreen( void )
  475. {
  476.      FILE *fp;
  477.      register int i,j;
  478.  
  479.      for ( i = 0; isascii(sname[i]); i++ )
  480.      {
  481.          namebuffer[i] = tolower((sname[i]));
  482.          if ( sname[i] == '.' )
  483.          {
  484.             namebuffer[i] = '\0';
  485.             break;
  486.          }
  487.      }
  488.      strcat(namebuffer,".c");
  489.      if ((fp=fopen(namebuffer,"w")) == NULL) {
  490.           gotoxy(0,24);
  491.           printf("SAVESCREEN COULD NOT OPEN \"%s\"\n",sname);
  492.           thurb();
  493.           exit(1);
  494.      }
  495.      namebuffer[i] = '\0';
  496.  
  497.      fprintf(fp,"\n\n/* Screen Array */\n\nchar %s_screen[4000]={",namebuffer);
  498.  
  499.      for ( i = 0; i < 4000; i++ )
  500.      {
  501.          if ( (i % 20) == 0 )
  502.             fprintf(fp,"\n");
  503.          j = video_RAM[i];
  504.          j &= 0xFF; 
  505.          fprintf( fp, "%d,", j );
  506.  
  507.          if (ferror(fp))
  508.          {
  509.             gotoxy(0,24);
  510.             printf("SAVESCREEN COULD NOT WRITE TO \"%s\"\n",sname);
  511.             thurb();
  512.             exit(1);
  513.          }
  514.      }
  515.      fprintf(fp,"\n}; /* end: %s_screen */\n\n",namebuffer);
  516.      fclose(fp);
  517. }
  518.  
  519.  
  520. void saveit( void )
  521. {
  522.      int i;
  523.      for ( i = 0; isascii(sname[i]); i++ )
  524.      {
  525.          namebuffer[i] = tolower((sname[i]));
  526.          if ( sname[i] == '.' )
  527.          {
  528.             namebuffer[i] = '\0';
  529.             break;
  530.          }
  531.      }
  532.      strcat(namebuffer,".c");
  533.      if ( ask() ) 
  534.         writescreen();
  535. }
  536.  
  537.  
  538. void writeoldway( void )
  539. {
  540.      FILE *fp;
  541.      register int i;
  542.  
  543.      if ((fp=fopen(sname,"wb")) == NULL) {
  544.           gotoxy(0,24);
  545.           printf("SAVESCREEN COULD NOT OPEN \"%s\"\n",sname);
  546.           thurb();
  547.           exit(1);
  548.      }
  549.  
  550.      for ( i = 0; i < 4000; i++ )
  551.      {
  552.          fputc( video_RAM[i], fp );
  553.          if (ferror(fp))
  554.          {
  555.             gotoxy(0,24);
  556.             printf("SAVESCREEN COULD NOT WRITE TO \"%s\"\n",sname);
  557.             thurb();
  558.             exit(1);
  559.          }
  560.      }
  561.      fclose(fp);
  562. }
  563.  
  564.  
  565. void saveit0( void )
  566. {
  567.      if ( ask2() ) 
  568.         writeoldway();
  569. }
  570.  
  571. main( int argc, char **argv )
  572. {
  573.      char far *p;
  574.      union REGS x;
  575.      int i;
  576.  
  577.      vid_init(0);
  578.      p = savescreen(&x);
  579.      if ( setjmp(isis) ) goto Zoo;
  580.      signal(SIGINT,iris);
  581.      if ( argc < 2 )
  582.      {
  583.         restorescreen(p,&x);
  584.         wprintf("\n^2   Usage: C>EDITSCRN [ [*.SCN] | [filename] ... ]  ^0\n\n");
  585.         wprintf("^1F1 .. F10^0, set screen attribute (F10 is normal)    \n");
  586.         wprintf("^1Shift-F1 .. Shift-F10^0, box characters (single line)\n");
  587.         wprintf("^1Alt-F1 .. Alt-F10^0, box characters (double line)    \n");
  588.         wprintf("Press ^1Home^0 to report current cursor location       \n");
  589.         wprintf("Press ^1Esc^0 when done editing                        \n\n");
  590.         goto Zp;
  591.      }
  592.      else for ( i = 1; i < argc; i++ )
  593.      {
  594.         sname = argv[ i ];
  595.         editscreen();
  596.      }
  597. Zoo: restorescreen(p,&x);
  598. Zp:  vid_exit();
  599.      signal(SIGINT,SIG_DFL);
  600.      exit (0);
  601. }
  602.  
  603.